#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os

# 【查看帮助】
# for i in dir(os):
#     print(i)
# help(os.path)

"""
python有6个数据类型
1.数字   1 ， 2.3
2.字符串   'hello world'
3.列表     [] , [2, 3], [2, [2, 'hello']]
4.元组     () , (2, 3), (2, (2, 3))
5.集合     set()
6.字典     {"name":"jack","age":18}
"""
# 【变量的使用】
a = r'test\n'  # 字符串前面加了r后原样输出，适合打印一些带有特定字符的对象
b = 'test\n'  # \n 表示换行，print打印出一个新行
print(a, b)
# globals x  #应用在函数或这类方法中，global 将变量当成一个全局的变量来使用，尽量少用global，因为会导致变量的重复引用后值不相同
c = 0 or 2 or 1
# 在布尔逻辑运算中，0，空字符串''，空列表[]，空元组()，空字典{}，None 都是False
# 在进行判断语句中如果返回的对象中是上述几个情况那么就是False if not c: pass
print(c)
# name = input("input:").strip()
# print("name", name)


# ============================================================================================================
# 【打印】
a = 2
print("字符串:%s" % a)
print("整数:%d" % a)
print("浮点:%f" % a)
print("原样打印:%r" % a)
print('abc', )

# ============================================================================================================
# 1.【字符串的相关操作】
print("*" * 100)
str_line = "  zi\t fucuan "
print(str_line.expandtabs(tabsize=8))  # \t表示tab符号，将tab符号转换为空格，默认8个空格
print(str_line.startswith('zi'))  # 用来判断字符串是以哪个字符对象开头的，结合正则表达式来使用
print(str_line.endswith('\t'))  # 用来检测检测字符串是否以obj结束
print(str_line.strip())  # strip 用于去除字符串开头的空格
print(str_line.rstrip())  # rstrip 用于删除字符串末尾的指定字符串
print(str_line.lstrip())  # lstrip 和strip效果类型，lstrip用于去除左边的空格

str_list = 'ABcd244F'
print(str_list[::-1], str_list[1:3])  # 字符串的倒序，字符串也支持切片操作
print(str_list.lower())  # 用于将字符串中的所有大写转换为小写
print(str_list.upper())  # 用于将字符串中所有的小写转换为大写
print(str_list.isupper())  # 字符串中的字符所有都为大写返回True
print(str_list.islower())  # 字符串中的字符所有都为小写返回True

str_space = ' '
print(str_space.isspace())  # 用于判断字符串字符是空格
print(str_list.isalnum())  # 用于判断字符串中字符至少有一个字符，并且字符都是字母或数字则返回True
print(str_line.isalpha())  # 用于判断字符串中字符至少有一个字符，并且字符都是字母则返回True
str_digit = '222'
print(str_digit)
print(str_digit.isdigit())  # 字符串中所有的字符都是数字则返回True
print(str_digit.isnumeric())  # 字符串中只包含数字时返回True
print(str_digit.isdecimal())  # 用于判断字符串中的所有字符是否是十进制的字符

print(str_list.count('4'))  # 用于计算字符串中某一个字符出现的次数
print(str_list.split('2'))  # 将字符串以obj为中心切片成一个列表
print("string format :{}".format(str_line))
print(str_list.replace('2', 'A'))  # 见明知义，将字符串中某个字符替换成另外一个字符
print(str_list.index('A'))  # 找出字符串中对应的索引下标,如果不存在则报错
print(str_list.find('9'))  # 查找字符串中是否存在该字母，如存在返回索引下表，不存在返回-1
print(':'.join(str_list))  # 以 : 作为分隔符，将所有元素合并为一个新的字符串
print(','.join(str_list))  # 以 , 作为分隔符，将所有元素合并为一个新的字符串
# 字符串在Python内部的表示是unicode编码，因此，在做编码转换时，通常需要以unicode作为中间编码
# decode 解码， encode:编码; 如果要将其他的编码转换成utf-8必须先解码成unicode，再将其(unicode)编码成utf-8
print(str_line.encode())  # 编码成utf-8;

# ===========================================================================================================
# 2.【列表相关的操作】
print("*" * 100)
list_line = ['apple', 'mango', 'carrot', 'banana', 'apple']
shop_list = ["cuke", "potato", "tomato"]
list_line.insert(0, "tencent")  # 向列表中指定位置插入一个元素
list_line[2] = 'tcs'  # 替换列表中某个元素
list_line.append("ali")  # 向列表中的末尾追加一个字符，也可以追加一个列表
list_line.append(shop_list)  # 向列表中的末尾追加一个列表
list_line.extend(shop_list)  # 将另一个列表中所有元素合并到该列表中组成一个新的列表

print(list_line)
print(list_line.index("apple"))  # 找出列表中该元素所对应的下标。类似于字符串中string.index()。元素不存在报错
print(list_line.count("apple"))  # 找出列表中该元素的个数，字符串中也有该用法string.count()。元素不存在则为0

# print(list_line.remove("apple"))  # 用于删除列表中从左到右的第一个元素。
# print(list_line.clear())  # 清除列表中所有的元素
del list_line[0]  # 删除指定下标的元素，类似remove方法
print(list_line.pop())  # 删除列表中最后一个元素，并返回该值。类字典中的方法类型dict.pop()

# print(list_line.copy())
list_digit = [2, 3, 44, 55, 8, 9]
print(list_digit.sort(), list_digit)  # 用于排列列表中元素的顺序
print(list_digit.reverse(), list_digit)  # 将列表中的元素位置进行反转
print(list_line)

# 列表中的切片,利用列表中的下标索引进行的增加，筛选操作
list_qie = ['xiaomi', 'tencent', 'huawei', 'baidu', 'ali', 'tencent']
print(list_qie[1:])  # 打印列表中第一个到最后一个的元素
# , list_qie[:-1], list_qie[::-1]
print(list_qie[:-1])  # 打印列表中第0个到倒数第一个的元素，即排除了最后一个元素
print(list_qie[::-1])  # 列表倒序，类似于列表中的reverse方法
print(list_qie.reverse())
print('\t'.join(list_qie))  # 将列表转换为字符串，不同于字符串中的join方法。

# import sys
# sys.path[1:1] = 6
print(list(set(list_qie)))  # 首先用set集合将原有列表中的元素进行去重，然后list成列表
print(tuple(list_qie))  # 利用tuple，将列表中所有的元素转成元组
print(eval("['a',2]"))  # 将字符串当成表达式求值，得到列表
print(list_qie, list_qie.copy())  # 拷贝一个新的列表出来

# ===========================================================================================================
# 3.【元组相关的操作】
print("*" * 100)
tuple_str = ("hello world", 2, 'a')
print(tuple_str.count(2))  # 计算出元组中的元素的个数
print(tuple_str.index('hello world'))  # 找出元组中对象的下标索引
print(tuple_str[0])
# tuple_str[1] = 3  # 不支持！！！ 元组是6个数据类型中其中一个不可变的，即不能对其进行修改，相对于列表，元组是安全的数据类型

# ===========================================================================================================
# 4.【字典相关的操作】
print("*" * 100)
dict_str = {
    "name": "jack",
    "age": 18,
    "weight": 120,
    "height": 180,
    "school": "qinghua"
}
pass
dict_str['company'] = "tencent"  # 字典中key不存在增加一个元素，如果key村子啊修改其值
print(dict_str.update({"country": "China"}))  # update用于更新字典中的元素，参数为字典
print(dict_str.get("company"))  # 通过key来获取字典中value值
print(dict_str.keys())  # 取出字典中所有的key
print(dict_str.values())  # 返回字典中所有的value值
print(dict_str.fromkeys("school"))  # 将字典的key分隔成一个新的字典

del dict_str['height']  # 删除字典中指定的元素
print(dict_str.pop("weight"))  # pop用于删除字典中指定的元素，并返回该字典对应的值
# print(dict_str.clear())  # 用于清除字典中所有的元素
print(dict_str.items())  # 返回一个键值对组成的元组的列表
print(dict_str.popitem())  # 返回最后一个元素的键值的元组
print(dict_str.copy())
print(dict_str.setdefault("company", "huawei"))  # 为字典创建一个值，如果key存在，则按原有的值来返回，不存在创建一个新的值
print(len(dict_str))  # 返回字典中键值的个数
print(dict_str)

list_s = ['a', 'b', 'c', 'b']
for i in range(len(list_s)):
    print(i, list_s[i])
for x, Lee in enumerate(list_s):
    print("%d %s Lee" % (x + 1, Lee))

# ===========================================================================================================
# 5.【集合相关的操作】
print("*" * 100)
# 集合是不可变的数据类型，是一个无序的不重复的元素序列
# 可以使用大括号或者set()函数来创建，空的集合必须用set()
# set_obj = set()
set_objs = {'a', 2, 'c'}
set_obj = {'e', 2, 'c', 'f', 5, 'a', 2, 'c'}

set_objs.add('b')  # 向集合中添加字符
print(set_objs.copy())  # 返回一个新的集合，浅拷贝
print(set_objs.clear())  # 删除集合中所有的元素
print(set_objs.pop())  # 删除集合中任意一个对象，并返回它
print(set_obj.discard(6))  # 如果对象存在于集合中，则删除集合中的对象
print(set_objs.remove('a'))  # 删除集合中指定的元素，如果不存在则会报KeyError。集合的删除建议使用discard
print(set_objs.update('d'))  # 增加一个元素，并集元素到该集合中
print(set_objs.difference(set_obj))  # 返回一个新的集合，set_objs - set_obj
print(set_objs.difference_update(set_obj))  # s中的成员是属于s但不包含在t中的元素
print(set_objs.intersection(set_obj))  # 两个集合的交集
print(set_objs.intersection_update(set_obj))  # s中的成员是共用属于s和t的元素
print(set_objs.isdisjoint(set_obj))  # 判断两个集合是否无交集
print(set_objs.issubset(set_obj))  # 如果set_objs 是set_obj的子集，则返回True
print(set_obj.issuperset(set_objs))  # 如果set_obj 是set_objs 的超集则返回True
print(set_objs.symmetric_difference(set_obj))  # 集合set_obj - set_objs
print(set_objs.symmetric_difference_update(set_obj))  # 移除set_objs中与set_obj相同的元素，并将不重复的元素加入到set_objs中
print(set_objs, set_obj)
